/**
 * Tabla Standar con un Titulo para la misma (opcional) y funciones para acelerar la produccion.
 */
qx.Class.define("qx.ui.form.ow.Grid",
{
	extend : qx.ui.container.Composite,
	/**
	* @param label {String ? null} Valor inicial del Titulo de la Tabla.
	* @param structure {Map} Mapa estructural de las columns de la Tabla.
	* @param width {Integer ? 300} Ancho de la Tabla.
	* @param height {Integer ? 200} Largo de la Tabla.
	* @param data {String[][] ? null} Matriz de datos.
	*/
	construct : function (label, structure, width, height, data)
	{
		/*
		*******************
			ESTRUCTURA
		*******************
		label: nombre (String)
		width: ancho (Integer)
		visible: valor (Boolean)
		tipo: valor (String) <-- ver todavia...
		******************
		*/
		this.base(arguments);

		this.setLayout(new qx.ui.layout.VBox(1));

		this._label = new qx.ui.basic.Label(label);
		if (width)
			this._label.setWidth(width);
		else
			this._label.setWidth(300);
		this._label.setRich(true);


		this._model = new qx.ui.table.model.Simple();

		var arrayColumns = [];
		for(var r in structure)
		{
			//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
			if (typeof structure[r] != 'function')
			{
				arrayColumns.push(structure[r].label);
			}
		}
		this._model.setColumns(arrayColumns);

// 		this._model.setData([[1, parseInt("2")], [11, "22"], [111, parseInt("222")]]);

		this._grid = new qx.ui.table.Table(this._model);
		this._grid.setShowCellFocusIndicator(false);

		for(var r in structure)
		{
			//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
			if (typeof structure[r] != 'function')
			{
				if (structure[r].width != null)
				{
					this._grid.setColumnWidth(r, structure[r].width);
				}
				if (structure[r].visible == false)
				{
					this._grid.getTableColumnModel().setColumnVisible(r, structure[r].visible);
				}
			}
		}
		if (width)
			this._grid.setWidth(width);
		else
			this._grid.setWidth(300);

		if (height)
			this._grid.setHeight(height);
		else
			this._grid.setHeight(200);

		if (data != undefined)
		{
			this.setValue(data);
		}

		this._grid.setShowCellFocusIndicator(false);
		this._grid.getSelectionModel().clearSelection();
		this._grid.getSelectionModel().removeSelectionInterval();
		this.add(this._label);
		this.add(this._grid);
	},
	members :
	{
		_label : null,
		_model : null,
		_grid : null,
		_SQL : null,
		_structure : null,
		/**
		* TODO.
		* @param data {String[][]}
		* @return void
		*/
		addRows : function (data)
		{
			this._model.addRows(data);
		},
		removeRows : function (numRow, howMany)
		{
			if (numRow != null)
			{
				if (howMany != null)
				{
					this._model.removeRows(numRow, howMany);
				}
				else
				{
					this._model.removeRows(numRow, 1);
				}
				this._grid.resetCellFocus();
				this._grid.getSelectionModel().removeSelectionInterval();
			}
		},
		getNumRowSelected : function () { return this._grid.getSelectionModel().getLeadSelectionIndex()},
		getRowCount : function () { return this._model.getRowCount() },
		/**
		* Devuelve la cantidad de filas seleccionadas de la Tabla.
		*
		* @return {Integer}
		*/
		getSelectedCount : function () { return this._grid.getSelectionModel().getSelectedCount(); },
		/**
		* Devuelve el valor de la Fila y column especificada.
		* En caso de no especificar la column, se tiene en cuenta Todas las columns.
		* @param fila {Integer ? 0} Numero de Fila a tener en cuenta (Comienza desde 0).
		* @param column {Integer ? null} Numero de column a tener en cuenta (Comienza desde 0).
		* @return {String | String[]}
		*/
		getValue : function (row, column)
		{
			if (row == undefined)
			{
				row = 0;
			}

			if (column == undefined)
			{
				return this._model.getRowData(row);
			}
			else
			{
				return this._model.getValue(column, row);
			}
		},
		/**
		* Devuelve el valor(es) de la(s) Fila(s) seleccionada(s) y column especificada.
		* En caso de no especificar la column, se tiene en cuenta Todas las columns.
		* @param column {Integer ? null} Numero de column a tener en cuenta (Comienza desde 0).
		* @return {String | String[][]}
		*/
		getValueSelected : function (column)
		{
			if (this._grid.getSelectionModel().getSelectedCount() > 1)
			{
				var data = [];
				this._grid.getSelectionModel().iterateSelection(function(index)
				{
					if (column == undefined)
					{
						data.push(this._model.getRowData(index));
					}
					else
					{
						data.push(this._model.getValue(column, index));
					}
				}, this);
				return data;
			}
			else
			{
				if (column == undefined)
				{
					return this._model.getRowData(this._grid.getFocusedRow());
				}
				else
				{
					return this._model.getValue(column, this._grid.getFocusedRow());
				}
			}
		},
		/**
		* Metodo utilizado para definir el tamaño de las filas de la tabla.
		* @param height {Integer ? null} Tamaño de las filas de la tabla.
		*/
		setRowHeight : function (height) { this._grid.setRowHeight(height); },
		setColWidth : function (column, width) { this._grid.setColumnWidth(column, width); },
		/**
		* Metodo utilizado para definir el tipo de seleccion que usara la tabla.
		* @param modo {String} Modo de seleccion que usara la tabla. Los valores permitidos son: single y multiple.
		*/
		setSelection : function (modo)
		{
			switch (modo)
			{
				case "single":
				{
					this._grid.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION);
					break;
				}
				case "multiple":
				{
					this._grid.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.MULTIPLE_INTERVAL_SELECTION);
					break;
				}
				default :
				{
					this._grid.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION);
					break;
				}
			}
		},
		getRemoteData : function ()
		{
			var SQL = this._SQL;
			if (!SQL.hasListener("dataCompleted"))
			{
				SQL.addListener("dataCompleted", function (e)
				{
					var xml = e.getData();
					var dataXML = xml.getElementsByTagName("reg");
					var rs = "";
					if (this._structure != null)
					{
						var structure = this._structure;
					}
					else
					{
						var structure = this._SQL.getStructure();
					}
					var data = [];
					for (var i=0; i<dataXML.length; i++)
					{
						var fields = [];
						var rs = '';
						rs = dataXML[i];
						var r = '';
						for (r in structure)
						{
							//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
							if (String(parseInt(r)) != 'NaN')
							{
								fields.push(rs.getAttribute(structure[r].name));
							}
						}
						data.push(fields);
					}
					this._model.setData(data);
					this._grid.setShowCellFocusIndicator(false);
					this._grid.getSelectionModel().clearSelection();
					this._grid.getSelectionModel().removeSelectionInterval();
				}, this);
			}
			SQL.getData(this._structure);
		},
		/**
		* Metodo utilizado para asignar valores a la tabla.
		* @param data {String[][]} Matriz de datos.
		*/
		setValue : function (data) { if (data) { this._model.setData(data); } },
		setSQL : function (SQL, structure)
		{
			this._SQL = SQL;
			this._structure = structure;
			if (!SQL.hasListener("updateStructure"))
			{
				SQL.addListener("updateStructure", function (e)
				{
					var arrayColumns = [];
	 				var label = this._label;
					var width = this._grid.getWidth();
					var height = this._grid.getHeight();
					if (this._structure == null)
					{
						for(var r in e.getData())
						{
							if (e.getData()[r].name != null)
							{
								arrayColumns.push(e.getData()[r].name);
							}
						}
					}
					else
					{
						var i = '';
						for (i in this._structure)
						{
							var r = '';
							for(var r in e.getData())
							{
								//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
								if (String(parseInt(r)) != 'NaN')
								{
									if (e.getData()[r].name == this._structure[i].name)
									{
										if (this._structure[i].label != null)
										{
											arrayColumns.push(this._structure[i].label);
										}
										else
										{
											if (this._structure[i].name != null)
											{
												arrayColumns.push(this._structure[i].name);
											}
										}
									}
								}
							}
						}
					}
					this.removeAll();

					this._label = label;
					this._model = new qx.ui.table.model.Simple();
					this._model.setColumns(arrayColumns);

					this._grid = new qx.ui.table.Table(this._model);
					this._grid.setWidth(width);
					this._grid.setHeight(height);

					var r = '';
					for(var r in e.getData())
					{
						//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
						if (String(parseInt(r)) != 'NaN')
						{
							var i = '';
							for (i in this._structure)
							{
								if (e.getData()[r].name == this._structure[i].name)
								{
									if (this._structure[i].width != null)
									{
										this._grid.setColumnWidth(i, this._structure[i].width);
									}
									if (this._structure[i].visible == false)
									{
										this._grid.getTableColumnModel().setColumnVisible(i, this._structure[i].visible);
									}
								}
							}
						}
					}

					this.add(this._label);
					this.add(this._grid);
				}, this);
			}
			SQL.updateStructure();
		},
		getGrid : function () { return this._grid },
		getModel : function () { return this._model },
		focus : function ()
		{
			this._grid.setFocusedCell(0, 0);
			this._grid.focus();
		}
	}
});
